package com.kern.proxytest;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 *  实现 InvocationHandler 接口, 完成代理需要做的功能
 *  1. 调用目标方法
 *  2. 增强功能
 * Created by caoshi at 19:15 2021-07-18
 */
public class MySellHandler implements InvocationHandler {

    // 目标类的实例
    private Object target = null;

    /**
     *  动态代理: 目标类是活动的, 通过构造器从外部传进来
     *  由传入的对象创建代理
     * @param target
     */
    public MySellHandler(Object target) {
        this.target = target;
    }


    /**
     * 代理类执行方法, 可对目标方法的结果进行进一步操作加工
     * @param proxy     代理对象
     * @param method    要执行的目标方法
     * @param args      目标方法的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        Object res = null;

               // 执行目标方法
        res = method.invoke(target, args);

        // 代理类可以对返回结果进行进一步的操作
        if (res != null) {
            Float price = (Float) res;
            price += 25;
            res = price;
        }

        return res;
    }
}
